Crea una calcolatrice che chieda all'utente due numeri e un'operazione (+, -, *, /) e gestisca tutti i possibili errori di input.
π Requisiti:
- Gestire input non numerici (ValueError)
- Gestire divisione per zero (ZeroDivisionError)
- Gestire operatori non validi
- Fornire messaggi di errore chiari all'utente
- Permettere all'utente di riprovare in caso di errore
π§ͺ Test Cases:
Output: Risultato: 15.0
Output: Errore: Impossibile dividere per zero
Output: Errore: Input non numerico
Scrivi una funzione che legge un file di configurazione JSON e gestisce tutti i possibili errori legati ai file e al parsing JSON.
π Requisiti:
- Gestire file non trovato (FileNotFoundError)
- Gestire permessi insufficienti (PermissionError)
- Gestire JSON malformato (json.JSONDecodeError)
- Garantire chiusura del file con finally
- Ritornare un dizionario vuoto in caso di errore
- Loggare gli errori su console
Crea una funzione di validazione email che solleva eccezioni personalizzate per diversi tipi di errori di validazione.
π Requisiti:
- Creare classe eccezione base: EmailValidationError
- Creare eccezioni specifiche: InvalidFormatError, MissingAtSymbolError, InvalidDomainError
- Validare presenza di @
- Validare formato dominio (es: .com, .it, .org)
- Validare lunghezza minima parte locale (prima di @)
- Gestire tutte le eccezioni personalizzate nel chiamante
π§ͺ Test Cases:
valida_email("userexample.com") β MissingAtSymbolError
valida_email("u@ex") β InvalidDomainError
valida_email("@example.com") β InvalidFormatError
Scrivi una funzione che converte una lista di stringhe in numeri interi, gestendo le conversioni non valide senza interrompere l'intero processo.
π Requisiti:
- Processare tutti gli elementi anche se alcuni falliscono
- Ritornare tupla: (lista_valori_convertiti, lista_errori)
- Per ogni errore, salvare: indice, valore originale, tipo errore
- Usare else per confermare conversioni riuscite
- Stampare statistiche finali (successi/fallimenti)
π§ͺ Test Cases:
Output: ([10, 20, 30], [info_errore_abc, info_errore_xyz])
Statistiche: 3 successi, 2 fallimenti
Implementa un sistema di login che blocca l'account dopo 3 tentativi falliti, gestendo diverse tipologie di errori.
π Requisiti:
- Creare eccezioni: InvalidCredentialsError, AccountLockedError
- Massimo 3 tentativi di login
- Validare lunghezza username (min 3 caratteri)
- Validare lunghezza password (min 6 caratteri)
- Bloccare account dopo 3 tentativi falliti
- Usare finally per loggare ogni tentativo
- Ritornare True se login riuscito, False altrimenti
Crea un parser CSV che gestisce file corrotti, righe malformate e dati mancanti, continuando l'elaborazione e generando un report degli errori.
π Requisiti:
- Leggere file CSV con gestione errori I/O
- Validare numero colonne per ogni riga
- Gestire righe con dati mancanti
- Convertire tipi di dati con gestione errori
- Non interrompere il parsing per righe corrotte
- Generare report: righe totali, valide, corrotte
- Salvare righe valide in una lista
- Salvare dettagli errori in un log
Implementa un sistema di trasferimento denaro con gestione errori, validazioni e rollback in caso di fallimento.
π Requisiti:
- Validare importo (positivo, formato corretto)
- Verificare saldo sufficiente
- Simulare prelievo da conto A
- Simulare deposito su conto B
- Se deposito fallisce, eseguire rollback (ripristina conto A)
- Logging completo di ogni operazione
- Eccezioni personalizzate: InsufficientFundsError, InvalidAmountError, TransactionError
- Usare finally per rilasciare eventuali lock
Crea un decoratore che riprova automaticamente una funzione in caso di errore, con attesa crescente tra i tentativi (exponential backoff).
π Requisiti:
- Parametri: max_tentativi, delay_iniziale, eccezioni_da_catturare
- Attesa crescente: 1s, 2s, 4s, 8s (exponential backoff)
- Loggare ogni tentativo con dettagli
- Dopo max_tentativi, rilanciare ultima eccezione
- Catturare solo eccezioni specificate
- Preservare nome e docstring funzione originale
π§ͺ Test:
Tentativo 1: Errore, attesa 1s
Tentativo 2: Errore, attesa 2s
Tentativo 3: Successo β
Implementa un context manager personalizzato per gestire connessioni database con commit/rollback automatico.
π Requisiti:
- Creare classe DatabaseConnection come context manager
- Implementare __enter__ per aprire connessione
- Implementare __exit__ per chiusura e gestione errori
- Se nessun errore: commit automatico
- Se errore: rollback automatico
- Garantire chiusura connessione sempre
- Logging di tutte le operazioni
- Gestire errori di connessione
Crea un sistema completo di monitoraggio errori che traccia, analizza e genera report su tutte le eccezioni che si verificano nell'applicazione.
π Requisiti:
- Classe ErrorMonitor singleton (unica istanza)
- Registrare ogni errore con: timestamp, tipo, messaggio, stack trace, contesto
- Metodi: register_error(), get_statistics(), get_errors_by_type()
- Calcolare: totale errori, errori per tipo, errore piΓΉ frequente
- Generare grafici temporali degli errori (opzionale)
- Esportare report in JSON e HTML
- Decoratore @monitor_errors per monitorare funzioni
- Alert se errori superano soglia in un periodo
π§ͺ Esempio Output:
- Totale errori: 45
- ValueError: 20
- ConnectionError: 15
- TypeError: 10
- Errore piΓΉ frequente: ValueError (44%)
- Ultimo errore: ValueError alle 14:35:22
- Integrazione con email per alert automatici
- Dashboard web per visualizzare statistiche real-time
- Raggruppamento errori per time window (es: errori per ora)
- Confronto con periodi precedenti
- Predizione di possibili problemi basata su trend
π Complimenti!
Hai completato tutti i 10 esercizi sulla gestione degli errori in Python!
Questi esercizi coprono tutti gli aspetti fondamentali e avanzati:
Try-Except-Else-Finally, Eccezioni Personalizzate, Context Manager,
Decoratori, Logging, Monitoraggio e Best Practices
π Criteri di Valutazione Suggeriti
Per Esercizi Facili (1-2):
- Gestione corretta delle eccezioni base (40%)
- Uso appropriato di try-except-finally (30%)
- Messaggi di errore chiari (20%)
- Codice pulito e commentato (10%)
Per Esercizi Medi (3-5):
- Eccezioni personalizzate ben strutturate (30%)
- Gestione completa di tutti i casi edge (30%)
- Uso corretto di else e finally (20%)
- Logging e documentazione (20%)
Per Esercizi Difficili (6-10):
- Architettura e design pattern appropriati (25%)
- Gestione errori complessa e rollback (25%)
- Robustezza e gestione casi limite (25%)
- Codice professionale e manutenibile (15%)
- Implementazione bonus (10%)
π‘ Suggerimenti per l'Implementazione
- Inizia dai facili: Costruisci confidenza con esercizi 1-2
- Testa sempre: Scrivi test per ogni caso (successo ed errore)
- Leggi gli errori: I traceback Python sono molto informativi
- Usa il debugger: pdb o IDE debugger per capire il flusso
- Refactoring: Prima fai funzionare, poi migliora il codice
- Documenta: Commenta le parti complesse e scrivi docstring
- Chiedi aiuto: Consulta la documentazione ufficiale Python
- Confronta: Studia soluzioni di progetti open source
π Risorse per Approfondire
- Documentazione Python: docs.python.org/3/tutorial/errors.html
- Real Python: Articoli approfonditi su exception handling
- PEP 8: Convenzioni di stile per il codice Python
- Stack Overflow: Cerca errori specifici e soluzioni
- GitHub: Studia codice di progetti famosi (Django, Flask, Requests)
- Python Testing: pytest per scrivere test delle eccezioni
π Dopo Questi Esercizi
Una volta completati tutti gli esercizi, sarai pronto per:
- β Scrivere codice Python robusto e affidabile
- β Gestire errori in applicazioni reali
- β Creare sistemi di logging professionali
- β Implementare pattern avanzati come retry e circuit breaker
- β Contribuire a progetti open source con confidenza
- β Affrontare colloqui tecnici su exception handling
Buon lavoro e... che i tuoi try siano sempre gestiti! πβ¨